/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managedbeans;

import beans.Atualizacao;
import beans.Convite;
import beans.Usuario;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpSession;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import persistence.DAO;
import persistence.DAOConvite;
import persistence.DAOUsuario;
import persistence.EMF;

@ManagedBean
@SessionScoped
public class UsuarioMB {

    private Usuario us;
    private Usuario amigo;
    private List<Atualizacao> atsAmigos;
    private DAOUsuario daoUser;
    private DAO dao;
    private HttpSession session;
    private String data;
    private String senhaNova;
    private String senhaOld;
    private List<String> lista = new ArrayList<String>();
    private String titulo;
    private Usuario antigo;
    private String msg;
    private String maxdate;
    private String buscanome;
    private List<Usuario> amigos = new ArrayList<Usuario>();
    private boolean pagAmigos;
    private String msgConvite;
    private boolean convPendente;
    private boolean solPendente;

    public UsuarioMB() {
        us = new Usuario();
        dao = new DAO(EMF.getEntityManager(), Usuario.class);
        daoUser = new DAOUsuario(EMF.getEntityManager());
        if (session == null) {
            session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        } else {
            session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        }
        for (int d = 0; d < 50; d++) {
            lista.add("teste " + d);
        }
        Authentication authentication = (Authentication) SecurityContextHolder.getContext().getAuthentication();

        if (authentication != null) {
            Object obj = authentication.getPrincipal();
            if (obj instanceof org.springframework.security.core.userdetails.User) {
                String username = ((org.springframework.security.core.userdetails.User) obj).getUsername();
                us = daoUser.BuscaLoginSenha(username);
                session.setAttribute("usuarioLogado", us);
            } else {
                System.out.println("NAO É OBJETO CERTO");
            }
        } else {
            System.out.println("NAO TEM OBJETO USUARIO");
        }
    }

    public boolean isSolPendente() {
        convite();
        return solPendente;
    }

    public void setSolPendente(boolean solPendente) {
        this.solPendente = solPendente;
    }

    public boolean isConvPendente() {
        convite();
        return convPendente;
    }

    public void setConvPendente(boolean convPendente) {
        this.convPendente = convPendente;
    }

    public String getMsgConvite() {
        return msgConvite;
    }

    public void setMsgConvite(String msgConvite) {
        this.msgConvite = msgConvite;
    }

    public boolean isPagAmigos() {

        pagAmigos = us.getAmigos().contains(amigo);
        return pagAmigos;
    }

    public void setPagAmigos(boolean pagAmigos) {
        this.pagAmigos = pagAmigos;
    }

    public List<Usuario> getAmigos() {
        return amigos;
    }

    public void setAmigos(List<Usuario> amigos) {
        this.amigos = amigos;
    }

    public String getBuscanome() {
        return buscanome;
    }

    public void setBuscanome(String buscanome) {
        this.buscanome = buscanome;
    }

    public String getSenhaNova() {
        return senhaNova;
    }

    public void setSenhaNova(String senhaNova) {
        this.senhaNova = senhaNova;
    }

    public String getSenhaOld() {
        return senhaOld;
    }

    public void setSenhaOld(String senhaOld) {
        this.senhaOld = senhaOld;
    }

    public String getMaxdate() {
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy");
        Date d = Calendar.getInstance().getTime();
        return sdf.format(d);
    }

    public void setMaxdate(String maxdate) {
        this.maxdate = maxdate;
    }

    public String getMsg() {

        if (us.getMensagem() == null || us.getMensagem().equals("")) {
            msg = "Digite a mensagem do perfil";
        } else {
            msg = us.getMensagem();
        }

        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getTitulo() {

//        FacesContext fc = FacesContext.getCurrentInstance();
//        HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
//        final String url = request.getRequestURI();
//        if(!url.equals("/Society/restritas/home2.xhtml")){
//            titulo = amigo.getNome();
//        }else{
//            titulo = us.getNome();
//        }

        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public List<Atualizacao> getAtsAmigos() {
        return atsAmigos;
    }

    public void setAtsAmigos(List<Atualizacao> atsAmigos) {
        this.atsAmigos = atsAmigos;
    }

    public Usuario getAmigo() {
        return amigo;
    }

    public void setAmigo(Usuario amigo) {
        this.amigo = amigo;
    }

    public List<String> getLista() {
        return lista;
    }

    public void setLista(List<String> lista) {
        this.lista = lista;
    }

    public String getData() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        data = sdf.format(us.getDataNasc());
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public Usuario getUs() {
        return us;
    }

    public void setUs(Usuario us) {
        this.us = us;
    }

    public String salvar() {
        Usuario u = daoUser.BuscaLoginSenha(us.getLogin());
        if (u == null) {
            if (us.getSenha().length() < 6) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("A senha deve conter no minimo 6 caracteres!"));
            } else {
                try {
                    us.setSenha(daoUser.criptografaSenha(us.getSenha()));
                    us.setFotoPerfil("css/img/perfil/semFoto.jpg");
                    us.setMensagem("");
                    us.setCidade("");
                    us.setEstado("");
                    us.setPais("");
                    us.setAuthority("ROLE_USR");
                    dao.salva(us);
                    session.setAttribute("logado", us);
                    return "index";
                } catch (NoSuchAlgorithmException ex) {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Falha ao cadastrar usuário"));
                    return null;
                }
            }
        } else {
            us.setLogin(null);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Usuário já cadastrado"));
        }
        return null;
    }

    public String atualizar() {
        boolean at = atualizacoes();
        if (at) {
            DAO daoat = new DAO(EMF.getEntityManager(), Atualizacao.class);
            Atualizacao a = new Atualizacao();
            a.setDataAtualiza(Calendar.getInstance().getTime());
            a.setUserPublica(us);
            a.setAlvo("Atualizou o perfil");
            a.setIdAlvo(1l);
            daoat.salva(a);
            daoUser.atualizacoes(us, a);
//            for (int x = 0; x < us.getAmigos().size(); x++) {
//                List<Atualizacao> ats = us.getAmigos().get(x).getAtualizaçoes();
//                ats.add(a);
//                us.getAmigos().get(x).setAtualizaçoes(ats);
//                dao.atualiza(us.getAmigos().get(x));
//            }
            dao.atualiza(us);
        } else {
//            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Nenhuma alteração realizada"));
        }

        return "home2";
    }

    public String mudarSenha() throws NoSuchAlgorithmException {
        int gravar = 0;
        if (senhaNova.equals("")) {
            gravar = 1;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Campo nova senha é obrigatório", ""));
        }
        if (senhaOld.equals("")) {
            gravar = 1;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Campo senha atual é obrigatório", ""));
        }
        if (gravar == 0) {
            if (daoUser.criptografaSenha(senhaOld).equals(us.getSenha())) {
                us.setSenha(daoUser.criptografaSenha(senhaNova));
                dao.atualiza(us);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Senha modificada"));
                return "nova";
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("A senha atual informada não é igual à senha atual"));
                return null;
            }
        } else {
            return "";
        }
    }

    public boolean atualizacoes() {

        long id = us.getId();

        EntityManager em = EMF.getEntityManager();

        em.detach(us);

        antigo = (Usuario) dao.recupera(id);

        int alter = 0;
        if (!us.getCidade().equals(antigo.getCidade())) {
            alter = 1;
        }
        if (!us.getEstado().equals(antigo.getEstado())) {
            alter = 1;
        }
        if (!us.getPais().equals(antigo.getPais())) {
            alter = 1;
        }
        if (!us.getNome().equals(antigo.getNome())) {
            alter = 1;
        }
        if (!us.getSobrenome().equals(antigo.getSobrenome())) {
            alter = 1;
        }
        if (!us.getDataNasc().equals(antigo.getDataNasc())) {
            alter = 1;
        }
        if (!us.getFotoPerfil().equals(antigo.getFotoPerfil())) {
            alter = 1;
        }
        if (!us.getMensagem().equals(antigo.getMensagem())) {
            alter = 1;
        }
        if (alter == 1) {
            return true;
        } else {
            return false;
        }
    }

    public String perfilAmigo() {

        if (amigo.getId().equals(us.getId())) {
            return "home";
        } else {
            atsAmigos = daoUser.buscaAts(amigo);
            return "amigos";
        }
    }

    public void atualizaMsg() {

        us.setMensagem(msg);
        dao.atualiza(us);
    }

    public void buscaAmigo() {

        amigos = new ArrayList<Usuario>();
        if (!buscanome.equals("")) {
            amigos = daoUser.BuscaNome(buscanome);
        }
    }

    public void addAmigo() {
        Convite c = new Convite();
        c.setUserReceiver(amigo);
        c.setUserSender(us);
        c.setTexto(msgConvite);
        DAO daoconvite = new DAO(EMF.getEntityManager(), Convite.class);
        daoconvite.salva(c);
    }

    public void remAmigo() {
        List<Usuario> usuarios = new ArrayList<Usuario>();
        usuarios = us.getAmigos();
        usuarios.remove(amigo);
        us.setAmigos(usuarios);
        dao.atualiza(us);
        usuarios = amigo.getAmigos();
        usuarios.remove(us);
        amigo.setAmigos(usuarios);
        dao.atualiza(amigos);
    }

    private void convite() {
        DAO daoconvite = new DAO(EMF.getEntityManager(), Convite.class);
        List<Convite> convites = daoconvite.lista();
        int conv = 0;
        int sol = 0;
//        System.out.println("us.getId() " + us.getId() + " amigo.getid() " + amigo.getId());

        for (Convite c : convites) {
            System.out.println("c.usersender " + c.getUserSender().getId() + " c.userreceiver " + c.getUserReceiver().getId());
            if (c.getUserSender().getId().equals(us.getId()) && c.getUserReceiver().getId().equals(amigo.getId())) {
                conv = 1;
            }
        }
        if (conv == 0) {
            for (Convite c : convites) {
                System.out.println("c.usersender " + c.getUserSender().getId() + " c.userreceiver " + c.getUserReceiver().getId());
                if (c.getUserSender().getId().equals(amigo.getId()) && c.getUserReceiver().getId().equals(us.getId())) {
                    sol = 1;
                }
            }
        }
        if(conv == 0){
            convPendente = false;
        }else{
            convPendente = true;
        }
        if(sol == 0){
            solPendente = false;
        }else{
            solPendente = true;
        }
    }
}